﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using RESTServices.Dominio;
using System.Data.SqlClient;

namespace RESTServices.Persistencia
{
    public class ItinerarioDAO
    {
        public string Crear(Itinerario itinerarioACrear)
        {
            string mensaje = "";
            string sql = "INSERT INTO TB_ITINERARIO VALUES(@ID_ITINERARIO, @ID_ORIGEN, @ID_DESTINO, @SALIDA, @LLEGADA, @TOTAL_ASIENTO, @ESTADO)";

            try
            {
                itinerarioACrear.Id_Itinerario = ObtenerUltimoCodigoItinerario();
                using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
                {
                    con.Open();
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        com.Parameters.Add(new SqlParameter("@ID_ITINERARIO", itinerarioACrear.Id_Itinerario));
                        com.Parameters.Add(new SqlParameter("@ID_ORIGEN", itinerarioACrear.Id_Origen));
                        com.Parameters.Add(new SqlParameter("@ID_DESTINO", itinerarioACrear.Id_Destino));
                        com.Parameters.Add(new SqlParameter("@SALIDA", itinerarioACrear.Salida));
                        com.Parameters.Add(new SqlParameter("@LLEGADA", itinerarioACrear.Llegada));
                        com.Parameters.Add(new SqlParameter("@TOTAL_ASIENTO", itinerarioACrear.Total_Asiento));
                        com.Parameters.Add(new SqlParameter("@ESTADO", itinerarioACrear.Estado));
                        com.ExecuteNonQuery();
                    }
                }
            }
            catch(Exception e)
            {
                mensaje = e.Message;
            }

            return mensaje;
        }

        public Itinerario Obtener(int ID_ITINERARIO)
        {
            Itinerario itinerarioEncontrado = null;
            
            string sql = "SELECT A.ID_ITINERARIO, A.ID_ORIGEN, A.ID_DESTINO, A.SALIDA, A.LLEGADA, A.TOTAL_ASIENTO, A.ESTADO, B.DESCRIPCION AS DESCRIPCION_ORIGEN, C.DESCRIPCION AS DESCRIPCION_DESTINO FROM TB_ITINERARIO AS A INNER JOIN TB_ORIGEN AS B ON A.ID_ORIGEN = B.ID_ORIGEN INNER JOIN TB_DESTINO AS C ON A.ID_DESTINO = C.ID_DESTINO WHERE A.ID_ITINERARIO = @ID_ITINERARIO";
            
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            { 
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con)) 
                {
                    com.Parameters.Add(new SqlParameter("@ID_ITINERARIO", ID_ITINERARIO));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            itinerarioEncontrado = new Itinerario()
                            {
                                Id_Itinerario = (int)resultado["ID_ITINERARIO"],
                                Id_Origen = (int)resultado["ID_ORIGEN"],
                                Descripcion_Origen = (string)resultado["DESCRIPCION_ORIGEN"],
                                Id_Destino = (int)resultado["ID_DESTINO"],
                                Descripcion_Destino = (string)resultado["DESCRIPCION_DESTINO"],
                                Salida = (DateTime)resultado["SALIDA"],
                                Llegada = (DateTime)resultado["LLEGADA"],
                                Total_Asiento = int.Parse(resultado["TOTAL_ASIENTO"].ToString()),
                                Estado = (string)resultado["ESTADO"]
                            };
                        }
                    }
                }
            }

            return itinerarioEncontrado;
        }

        public string Modificar(Itinerario itinerarioAModificar)
        {
            string mensaje = "";
            string sql = "UPDATE TB_ITINERARIO SET ID_ORIGEN = @ID_ORIGEN, ID_DESTINO = @ID_DESTINO, SALIDA = @SALIDA, LLEGADA = @LLEGADA, TOTAL_ASIENTO = @TOTAL_ASIENTO, ESTADO = @ESTADO WHERE ID_ITINERARIO = @ID_ITINERARIO";

            try
            {
                using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
                {
                    con.Open();
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        com.Parameters.Add(new SqlParameter("@ID_ITINERARIO", itinerarioAModificar.Id_Itinerario));
                        com.Parameters.Add(new SqlParameter("@ID_ORIGEN", itinerarioAModificar.Id_Origen));
                        com.Parameters.Add(new SqlParameter("@ID_DESTINO", itinerarioAModificar.Id_Destino));
                        com.Parameters.Add(new SqlParameter("@SALIDA", itinerarioAModificar.Salida));
                        com.Parameters.Add(new SqlParameter("@LLEGADA", itinerarioAModificar.Llegada));
                        com.Parameters.Add(new SqlParameter("@TOTAL_ASIENTO", itinerarioAModificar.Total_Asiento));
                        com.Parameters.Add(new SqlParameter("@ESTADO", itinerarioAModificar.Estado));
                        com.ExecuteNonQuery();
                    }
                }
            }
            catch(Exception e)
            {
                mensaje = e.Message;
            }

            return mensaje;
        }

        public void Eliminar(int ID_ITINERARIO)
        {
            string sql = "DELETE FROM TB_ITINERARIO WHERE ID_ITINERARIO = @ID_ITINERARIO";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();

                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@ID_ITINERARIO", ID_ITINERARIO));
                    com.ExecuteNonQuery();
                }
            }
        }

        public List<Itinerario> ListarTodos()
        {
            List<Itinerario> itinerariosListados = new List<Itinerario>();
            Itinerario itinerarioEncontrado = null;
            string sql = "SELECT A.ID_ITINERARIO, A.ID_ORIGEN, A.ID_DESTINO, A.SALIDA, A.LLEGADA, A.TOTAL_ASIENTO, A.ESTADO, B.DESCRIPCION AS DESCRIPCION_ORIGEN, C.DESCRIPCION AS DESCRIPCION_DESTINO FROM TB_ITINERARIO AS A INNER JOIN TB_ORIGEN AS B ON A.ID_ORIGEN = B.ID_ORIGEN INNER JOIN TB_DESTINO AS C ON A.ID_DESTINO = C.ID_DESTINO";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            itinerarioEncontrado = new Itinerario()
                            {
                                Id_Itinerario = (int)resultado["ID_ITINERARIO"],
                                Id_Origen = (int)resultado["ID_ORIGEN"],
                                Descripcion_Origen = (string)resultado["DESCRIPCION_ORIGEN"],
                                Id_Destino = (int)resultado["ID_DESTINO"],
                                Descripcion_Destino = (string)resultado["DESCRIPCION_DESTINO"],
                                Salida = (DateTime)resultado["SALIDA"],
                                Llegada = (DateTime)resultado["LLEGADA"],
                                Total_Asiento = int.Parse(resultado["TOTAL_ASIENTO"].ToString()),
                                Estado = (string)resultado["ESTADO"]
                            };
                            itinerariosListados.Add(itinerarioEncontrado);
                        }
                    }
                }
            }
            return itinerariosListados;
        }

        public List<Ciudad> ListarOrigenes()
        {
            List<Ciudad> origenesListados = new List<Ciudad>();
            Ciudad ciudadEncontrada = null;
            string sql = "SELECT ID_ORIGEN, DESCRIPCION FROM TB_ORIGEN";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            ciudadEncontrada = new Ciudad()
                            {
                                id_ciudad = (int)resultado["ID_ORIGEN"],
                                descripcion = (string)resultado["DESCRIPCION"]
                            };
                            origenesListados.Add(ciudadEncontrada);
                        }
                    }
                }
            }
            return origenesListados;
        }

        public List<Ciudad> ListarDestinos()
        {
            List<Ciudad> destinosListados = new List<Ciudad>();
            Ciudad ciudadEncontrada = null;
            string sql = "SELECT ID_DESTINO, DESCRIPCION FROM TB_DESTINO";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            ciudadEncontrada = new Ciudad()
                            {
                                id_ciudad = (int)resultado["ID_DESTINO"],
                                descripcion = (string)resultado["DESCRIPCION"]
                            };
                            destinosListados.Add(ciudadEncontrada);
                        }
                    }
                }
            }
            return destinosListados;
        }

        public int ObtenerUltimoCodigoItinerario() 
        {
            int ID_ITINERARIO = 0;

            string sql = "SELECT TOP 1 ID_ITINERARIO FROM TB_ITINERARIO ORDER BY ID_ITINERARIO DESC";

            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {                    
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            ID_ITINERARIO = (int)resultado["ID_ITINERARIO"];
                        }
                    }
                }
            }
            return ID_ITINERARIO + 1;
        }
    }
}